// 数据库连接池
package Tools

import (
	"golang.org/x/crypto/bcrypt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

var db *gorm.DB

func initDB() {
	dsn := "root:123456789@tcp(112.74.125.172:33066)/wechat?charset=utf8mb4&parseTime=True&loc=Local&timeout=10s"
	var err error
	db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	CherrError(err, "Connect to MySql Error!")
	sqlDB, err := db.DB()
	sqlDB.SetMaxOpenConns(100)
	//表示设置最大的可空闲连接数，该函数的作用就是保持等待连接操作状态的连接数，这个主要就是避免操作过程中频繁的获取连接，释放连接。默认情况下会保持的连接数量为2.就是说会有两个连接一直保持，不释放，等待需要使用的用户使用。
	sqlDB.SetMaxIdleConns(20)
}

func GetDB() *gorm.DB {
	// 若数据库指针为空,则初始化
	if db == nil {
		initDB()
	}
	return db
}

// 合并两个Map的方法，返回Map：重复的Key默认mapTwo会覆盖mapOne
func MergeMap(mapOne, mapTwo map[string]interface{}) map[string]interface{} {
	var res = make(map[string]interface{})
	for keyOne, valueOne := range mapOne {
		for keyTwo, valueTwo := range mapTwo {
			if keyOne == keyTwo {
				res[keyTwo] = valueTwo
			} else {
				// 如果res中没有这个Key，才保留
				if _, value := res[keyOne]; !value {
					res[keyOne] = valueOne
				}
				if _, value := res[keyTwo]; !value {
					res[keyTwo] = valueTwo
				}
			}
		}
	}
	return res
}

// 加密Bcrypt算法
func GetHash(password string) string {
	bytes, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	CherrError(err, "Hash ERROR!")
	if err != nil {
		CherrError(err, "Get hash ERROR!")
		return ""
	}
	return string(bytes)
}

// 密码验证
func ModifyHash(password, hash string) bool {
	err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
	return err == nil
}
